package Thread.demo7.CyclicBarrier;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 使用说明：
 * <p>
 * CountDownLatch注重的是等待其他线程完成，
 * CyclicBarrier注重的是：
 * 当线程到达某个状态后，暂停下来等待其他线程，所有线程均到达以后，继续执行。
 * 例子： boy和girl约会，到约会地点，两人在同时发朋友圈，玩完各自回家，各自洗完澡后再一起聊天
 *
 * @author
 * @create 2018-10-10 12:48
 **/
public class CyclicBarrierTest1 {

    public static void main(String[] agsg) {
        //参数表示有几个线程需要一起等待
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2);

        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String name = Thread.currentThread().getName();
                    //System.out.println(name);
                    if (name.equals("Thread-0")) {
                        name = "boy";
                    } else {
                        name = "girl";
                    }
                    System.out.println(name + "到了约会地点");

                    try {
                        //当执行到这里，则对应的part会减1
                        cyclicBarrier.await();
                        System.out.println("跟" + name + "约会");


                        //回家
                        cyclicBarrier.await();
                        System.out.println(name + "洗完澡了");
                        cyclicBarrier.await();
                        System.out.println(name + "开始聊天");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}
